<?php
// +----------------------------------------------------------------------
// | ZHANGKUI [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2023 http://www.rndchina.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Zhangkui < zk_admin@163.com >
// +----------------------------------------------------------------------
namespace app\admin\validate;

use think\Validate;
use think\Db;

class CommonValidate extends Validate
{
   /**
    * Func 验证手机号格式
    *
    * @param $mobile
    * @return bool
    */
   function isMobile( $mobile )
   {
      return preg_match ('/^(1)[0-9]{10}$/' , $mobile) ? true : false;
   }

    /**
     * func 自定义身份证验证方法
     * @param $value
     * @return bool
     */
    function checkIdCard($value)
    {
        // 15位正则
        $pattern15 = '/^[1-9]\d{7}(?:0\d|10|11|12)(?:0[1-9]|[1-2][\d]|30|31)\d{3}$/';
        // 18位正则（基础格式）
        $pattern18 = '/^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/';
        // 简单格式验证
        if (!preg_match($pattern15, $value) && !preg_match($pattern18, $value)) {
            return false;
        }
        // 如果是18位，验证校验码
        if (strlen($value) === 18) {
            return $this->validateIdCardChecksum($value);
        }
        return true;
    }

    /**
     * func 18位身份证校验码验证
     * @param $idCard
     * @return bool
     */
    function validateIdCardChecksum($idCard)
    {
        // 加权因子
        $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
        // 校验码对应值
        $verifyCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
        $sum = 0;
        $idCardUpper = strtoupper($idCard);
        for ($i = 0; $i < 17; $i++) {
            $sum += $idCardUpper[$i] * $factor[$i];
        }
        $mod = $sum % 11;
        return ($verifyCodes[$mod] === $idCardUpper[17]);
    }

    /**
     * func 自定义护照验证方法
     * @param $value
     * @return bool
     */
    function checkPassport($value)
    {
        // 常见护照格式正则（覆盖大部分国家）
        $patterns = [
            // 中国大陆: G/E开头 + 8位数字
            '/^[EeGg]\d{8}$/',

            // 中国香港: H/M/K开头 + 8位数字
            '/^[HhMmKk]\d{8}$/',

            // 普通护照: 1-2位字母 + 6-8位数字
            '/^[a-zA-Z]{1,2}\d{6,8}$/',

            // 美国/加拿大: 1位字母 + 8位数字
            '/^[a-zA-Z]\d{8}$/',

            // 特殊格式（如澳大利亚）
            '/^[a-zA-Z]\d{7}$/'
        ];

        foreach ($patterns as $pattern) {
            if (preg_match($pattern, $value)) {
                return true;
            }
        }

        return false;
    }
}